{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "19095b39-daba-4632-8b23-35b22ab71a8c",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 快速傅里叶变换fft\n",
    "具体要求参考[链接](https://www.wolai.com/zzutai/ne85AbnL15kmZPPJRQ2q4j)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4e42cc3e-b29d-463d-aa51-5a1dae08a51b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAJOCAYAAACz9fURAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlHElEQVR4nO3dfZxWdZ0//tcAwyByJ6JCigphm0ToZhCm6XqPJWrlFpnfVlvNm7LUyg1XU7ZNrVW7My2TckurLbfW1LxhV6Kb9Q5NkmDNOzINExEZEBiGYX5/8OOKkeHIwNyda57Px2MecJ3rnHN9rnlf1znv85pznaumubm5OQAAAAAAQKt6dfUAAAAAAACgOxOkAwAAAABAAUE6AAAAAAAUEKQDAAAAAEABQToAAAAAABQQpAMAAAAAQAFBOgAAAAAAFBCkAwAAAABAAUE6AAAAUGp/+ctfctttt2Xp0qVdPZSK5ubm/OEPf9js/atXr059fX2ryz3zzDOvuf5169alqalpm8Z422235Sc/+ck2rePVli5dmuXLl1dur1u3Lvfdd1+7PgZAV+jT1QMAYFPNzc1Zs2ZN+vbtm5qamiTrDw5WrlyZUaNGbTL/iy++mGHDhr3mepuamlJTU5Nevbb+76hf//rXM2nSpOy3335bvY5Xe+aZZ7L77rtXbi9atCirV69u9bkCAMCrPfTQQ5kyZUoeeeSR7LDDDq3Os3Llyrz00kuV28OGDUu/fv1y//3355Of/GSry1x33XUZO3bsJtMbGxuzYsWKLF++PC+//HL+/Oc/589//nOeffbZPPXUU3n88cczb968LF++PL/4xS9y0EEHbbKO++67L5MnT87999+fffbZpzL9ySefzN/8zd/khz/8Yf7+7/9+s8/5M5/5TG6//fb8/ve/T5I88cQTWbt2bavzNjY2ZsCAAZv017fddlteeeWVvOc970ny12OO2traVtexbt26vP71r6+M88knn8yRRx7ZYr7TTz899fX1ue2229KnT5/84he/yOTJkzNnzpyMHz9+s88HoLsTpAN0km9961v5yEc+0qZl/vSnP2W33XZLksyaNSv/+I//mOeffz4DBw5sMd+pp56axYsX51e/+lVhSL7//vtnwoQJ+frXv541a9bkqaee2uy8DQ0N2XXXXTcJ6L/2ta+lX79+lSD96aefTq9evdK7d+9W19G/f/+MGDEiSXLXXXdlr732yujRoyvzrFmzJgcccEBOP/30XHjhhUmSa6+9Nt/73vfy+9//Pv379y/6FQEAQLbbbrsk2WyIniT/8R//kQ9/+MOV27feemuOOeaYrF69Ok8++WR++tOfVu5btWpVDj300PTp03psMmzYsNTX16d3794ZMGBAhg4dmuHDh2f48OHZbbfd8u53vztnn312dt1110rw/Grz5s3LTjvttEm4PHPmzAwcODBHH330az7nDc87SQ4++ODU19enrq5uk3mbmpry3ve+N9dff32L6f369WsRvl9zzTX5yle+0urzbmhoyC677JInnngiSXLjjTfmsssuy89+9rMceeSRWbVqVfr06ZN/+7d/y9ve9rbMnTs3++23X77yla/kIx/5SN785jdnzZo1SZK+ffsWPjeA7kiQDtBJ6urqMnjw4Dz77LMtpn/ve9/LwoULc9FFF1WmbTgjfciQIZVpzz77bN72trdtEqIvWrQoP//5z/PVr371Nc8037jZ/uMf/5i99947O+ywQ6vLrVmzJldffXU+9KEPtZjer1+/Fs35hz/84TzyyCOtBumrVq3K+9///nz7299OknzhC1/I008/ndmzZ2f33XfPK6+8kn79+uXqq6/OOeeck3PPPTe9e/fON7/5zXz9619Pv379snr16tTW1ra6fgAAep6XXnopL7/8cmprayuf3nzxxReTJC+88EJ69epV6acbGxvz+te/PrW1tenbt2/e9ra35b777suYMWMqYe7atWvT0NDQ4vIjGwLfhoaGVsewbt26XHfddTnttNPaPP5ly5Zl+fLlmTNnTg4++OA899xzSdb/EWD77bfPjTfemL333jv/9V//1WK597znPenfv38aGxvTu3fvynPfcKZ4//798/nPfz4nnnhi+vTpU+nxN/wuNu7hb7nllixevDi///3vs3r16lx//fXp169fpk+fnunTp2/R87j44ovz+OOP5x/+4R/yhz/8Iccdd1x+97vfpXfv3qmvr8/BBx+cAQMG5IUXXsiQIUPy4x//OGvXrs0nP/nJXHDBBW3+vQF0NUE6QCfZ0MgOGDCgxfRbb701o0eP3mT6qz311FPZe++9N5l+2WWXZb/99svpp5+e5ubmfPWrX83JJ5+cwYMHV+ZZs2ZNiwON1atXVw4cHn744QwfPjx1dXWV+9etW5fGxsZKs7127drccMMNSdYfuPziF7+oXHpl1qxZW/w7+OlPf5r9998/Z555Zn7yk59kxIgRqaurS69evfLiiy9m5MiR6dWrV5YsWZKPfexjOeuss9LY2Jif/exnecc73rHFjwMAQPX6zne+kwsvvDB9+vSpnGyx4azqww47LDU1NZV+ds2aNXnyySez5557bnK5kg233/jGN+aqq65q9XF22WWXVsfQ1NTU6uVPWtPY2JjGxsbKJy2/8IUv5LLLLqvcf9NNNyVZfxmZgw8+OP/7v/+bffbZJ1/+8peTrO/lH3300Rx22GHp379//t//+3/5j//4j8ryffv2zec+97lsv/32SZIjjzwys2fP3mQcy5cvrxxz/Nu//VuGDh2a+vr6rFmzJg8++GB+/vOf56STTspnP/vZXHnllS1O4HnllVfy7ne/O9/97ndbrPP666/PCy+8kIEDB+aHP/xh/vM//zNnnnlmpk6dmjFjxuRf//VfM2zYsNx888155ZVX8thjj+W8887bot8bQHfjy0YBusBFF12UPn36pE+fPrnjjjty7bXXVm5v+Pm///u/JMkVV1yRN7zhDbnxxhtz8803Z9y4cRk3blweeeSRPP744/n3f//3zJgxIzU1NXn55ZfzjW98IyeddFKam5srj7f77runV69emT17dq688spst912efTRRyv3b7fddunVq1dqampSU1OT3r1754ADDmgx5tNOOy1z587NmjVr8uKLL+bmm2+uhOsHHXRQdthhh8rHWTcE8xvORN9g8ODBufvuu/PjH/84dXV1+dWvfpVvfetb+ctf/pKddtopP/rRj/KLX/wiSfL888/nM5/5TG688UYhOgAAFZ/85CezatWqyvXJX3755dx2221Jkt///vd5+eWXU19fn1WrVqWpqSl77rlnkmzyKcyampq84Q1vyD777JNPfepT+dSnPpUJEybkpZdeqtweO3ZsJk+evMkYGhsbc8opp1T656Kfvn37trh8S11dXQ4++OA0NzdXfvbYY4/U1dXlyiuvzMSJE/PII49kzpw5mTNnTuWSM/369UuSfOlLX8ozzzyTT37ykxk/fnyeeeaZnHnmmZXn973vfS9/+tOfsmjRoixatCh//vOf84c//KHFJRP79OmT97znPdl///2z33775eyzz678UWL77bfPaaedlueff77y88///M+Vx0/Wf/K0sbExffr0qVyKsq6uLp///Oc3uXxMsv6s+IsuuiirVq1qW7EBuhFnpAN0gb59++bAAw+shMYbmzdvXt785jdXzgb/u7/7u+y88845/fTT80//9E/Zddddc8opp6S2tjYnnnhi/umf/qnyBUi1tbX5xje+kaOOOioXX3xx/uVf/iVJcu+996Zv3775+7//++yzzz45//zzW1xP8bHHHsuAAQMqzXdTU1OLayVuuEbiJz/5yfzqV7/KCSeckJdffjlz5sxJsr7Z/s53vpPjjz++sszkyZNbNNuvvPJK6urqMnz48EqT3tDQkJNOOin33nvvJr+HRYsW5aKLLspdd93V5t8vAABsiVdeeaVyKZU999wzffv2TVNTU8aNG5df/OIXueGGGyonj2zQ3NyctWvXZsaMGTn22GNf8zEaGhrS1NRUub25Sxb+7ne/y4wZM/Lf//3fLaY3NjYm+WuQvuH7hwYMGJDa2tqMHDkyyfoevrGxMTvttNMm695hhx1SX19fuXRk0WUTV61aldtvv73FJSkfe+yxvOUtb6ncPvXUU/Ozn/0sDQ0NOf300/OlL30p/fr1y7e//e0MHz58k+ewYsWKHHPMMfnEJz6RlStX+h4koJQE6QBdYMMlVLZknre+9a3Zaaedsnbt2px77rl59tlnK2dzz5kzJ4899lguvfTSNDQ0ZODAgRkyZEje+MY35vOf/3wmTpyYY445JqNGjUqyPsDffvvtM2rUqCxdujTJ+sZ+jz322OTxm5ubU19fn0GDBiXZ9Ayeja1atSpf/OIXc+ONN1amPfLII3n/+99fuf3GN74xy5Yty4oVK/LjH/84xxxzTPbdd9984xvfyM4777zJOuvr6/Ov//qvmTBhQhoaGlr90iQAAHqO+vr6vPDCC+nbt+8mvenixYuTrP9U48Y2vlb6xmH2Bq/uyzecRV40z8svv5wkGT16dIYNG7ZVz6U1b37zm3Prrbfm5ZdfznnnnVe53MyG67W31g+/9NJLOe2003LYYYdl3bp1+chHPpKPfOQjm32MDWeRFznttNNyzDHHbDJ9xx13rPx/w+VoTjrppNTV1eXmm2/ORz7ykdTV1VVC+l/84he5/vrr06dPn8q15K+++uqMGTMmDzzwQOEYALojQTpAJ9q44Z89e/ZrNrEb/OpXv8q+++6b/v375+GHH86b3vSmnHTSSVmzZk323XffjB49OsOHD2+xvp/85Cf5u7/7u03WNXfu3Lzzne+snK3+xje+cbOPe8ABB+TXv/71a47vG9/4RlasWLHJ9A0fo02SP/3pT0mS3XbbLXV1dTnvvPNy0003tbg2+0knnZQk2WWXXSofd50+fXo+/OEPt3rdSgAAeo477rgjH/rQh9K3b99NzqhuaGjI4MGDc/jhh7eYvm7dukqQvvF1xTcYNGhQTj755CTre9A1a9ZULrM4fPjwJOtPbNnYkiVLkiQ777xzvvnNb+aMM84oHPe0adNy6aWXtpg2e/bsTQL63r175+ijj85dd92Vr3zlKznjjDPyhje8IY2Njamtra0cS8yaNSs//elP88Mf/jCrVq3KyJEjc8ghh2TatGn54Q9/mMceeyz/8z//k6lTp+YnP/lJ7rjjjjQ1NaWpqalyvLC5E3tuu+22nHDCCZt9Lu9///vz7//+7y2m9enTJ1OnTs3UqVMLfw8AZSdIB+gkr7zySuXLfZqbm3PwwQcXXtpl4zNm/ud//icHHnhgkuSXv/xl3va2t2XAgAE54YQTUl9fnxUrVuSJJ55osZ4DDzwwAwYMyLp16/KDH/wgt956a+67777suuuumTZtWuVM80WLFuWDH/xgDjjggPzhD3/IuHHj8pnPfKbFpV2SzTfb559/fr761a9u9nl//etfzz/+4z+2mNanT598/etfz9e//vXNLgcAABt7//vf3+ITjxv8+Mc/ztlnn50f/ehHOeiggza7/M0335yFCxfmYx/7WF588cUkyW9/+9sWZ3p//OMfz+te97oWZ7avW7cu69atqwTZf/zjH1NTU5M999wzDzzwQHbbbbc8+OCDrT7me97znlbPJJ80aVJ+/OMfV27vv//+lf8fddRR+Zu/+ZtcccUVue666zb5dObMmTNz33335a1vfWteeOGFfPazn02y/kz54cOH5/HHH09NTU3Gjh2biy++OL17985nPvOZvP71r8+ZZ56ZJC2+T2ljtbW12XPPPSvf11RTU5NHH30048aNy/HHH1/4KdUkufzyy3PJJZds9v6f/vSnOfroowvXAdBd+bJRgE7ywgsvZOjQoUmS1atXV85CefXPm9/85so8G8ycOTODBg1Kc3Nzbr/99hx55JFJkk9/+tPZe++9W/258sork6w/C/6aa65JU1NTRo0a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eU+++tWv5re//W222267HHnkkbnmmmvyzW9+M7/85S9z6qmnJkn22WefnHzyyZX1XHHFFXnLW96S/fbbL9/5zneSrA+o16xZk+HDh+c3v/lNGhsbs88+++QHP/hBmpqactZZZ+Xb3/525Vrfa9asye67797iEo0b/xx44IGbfEqzoaEhBx98cItLM+6xxx4tAvff/OY3OeWUU3LUUUflK1/5SqZOndpiHQceeGCuvvrqHHTQQbnuuuvy8MMPV76I9c4778zTTz+d/fbbL1/5ylfymc98Jh/72MfyiU98InPnzm2xng3Pd+OxbXxGenNzcxoaGipnpG88xoaGhvzhD3/I5MmTM3v27Oy+++5pamrK3LlzW71efFNTk94eKLXib4ADYJs999xz+c53vpMLLrggyfpQ/NZbb80RRxyRn//853nf+96XV155JR/96EeTrL/UyQ033JB/+7d/y5577pn77rsvxx13XPbff/98+MMfTpKceOKJSdaHzH//93+fq666qsVjvutd72oRYK9YsSJDhw5NU1NTLr300nz0ox/Nm970przxjW/M4sWL8/DDD2e77bbLv/7rv+bkk0/OBz7wgRx77LE57bTT8pvf/KbFR0lba7ZPPfXUfOMb39jkuQ8ZMqRFs71gwYI0Njbms5/9bC688MIk68/Iufbaa3PjjTe2WHbDNSzXrVvnrHQAACpOO+20vPLKKznssMPylre8pcUXcW7swAMPTK9evSpnj7/aRz7ykfTv3z9nnXVWZdrGve4uu+yS2bNn5yc/+Une+973JkmOOuqoFuuYOnVqjj766AwYMKDVx/jVr361ybS///u/zyGHHNJi2s0335xdd921cnv8+PF55plnMm7cuFxwwQWVT7Zu8NWvfjW9evXKW9/61tTX12ennXaqnLX+1a9+NUlaLPNv//ZvOeuss1p8B1Ky/kz2jR155JGZMGFCq8/lv/7rv1rcrqury1133ZVddtml8oeFmpqaHHjggZk1a9Ymy/fp06dyAhFAGdU0b8kFvQDYJk888UR23nnnTa5tuHr16nz961/Pm9/85hxxxBGtXqpl3rx5OfPMM3PLLbdk6NChLe478cQT07dv39xwww0tpr/1rW/NYYcdli984QuVaT//+c8zZsyYvOENb6hcuuUd73hHkuTf//3fc/DBB2fPPfeszL927do8//zz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DgAA7atdgvQnn3wyp5xySi6//PI899xz2WOPPXLqqae+5nIPPfRQHn300SxdujRLly7NLbfc0h7DAQCAHktvDgAA7a9drpG+YMGCXHrppXnf+96XJDnzzDMzefLkwmWeffbZNDc3Z9y4ce0xBAAAIHpzAADoCO0SpB9zzDEtbj/22GMZM2ZM4TIPPvhgmpqasttuu2Xp0qWZMmVKrr322uywww7tMSQAAOiR9OYAAND+2iVI39iaNWtyxRVX5Nxzzy2c77HHHst+++2XK664Ir169copp5ySCy64INdee+1ml2loaEhDQ0Pldn19fZKksbExjY2N7fMESqqxce1G/29MY01zF45my7Qc89oeX8Oy2lA39es+2ro9aEsNy7it6Sm8F8utjPtE24NNdce6dVRvri+vLmXcBtE6/UD3sjX7yi2tof1w9+V9WG72idWjI2pX09zc3K5b2/PPPz933313HnzwwdTW1m7xcrNnz84JJ5yQxYsXb3aeSy65JNOnT99k+ve///30799/q8ZbLRqakvMfWP93kS9OXJu63l08oC1QxjFDGXTke8v7FjpGGd9bZRxzR1u5cmVOPPHELFu2LIMGDerq4STpuN5cX15dvJ+hY+jLoXy8t6pHR/Tm7Rqkz5w5M+9973tz3333ZezYsW1adu7cudl3332zevXq1NXVtTpPa2e+jBw5MosWLcqOO+64TWMvu5Vr1mafz92TJJl70aHp37fdP2zQ7jYe85zPHJTB2/fr4hGxNRobGzNz5swcccQRbTpAp+O0dXvQlhqWcVvTU3gvllsZ94m2B5tasmRJRowY0W2C9I7szfXl1aWM2yBapx/oXrZmX7mlNbQf7r68D8vNPrF6dERv3m5b2qeeeiof/OAHc+21125Ro37CCSfkU5/6VCZNmpRk/XUZhw8fvtkQPUnq6upavb+2trbHb5xqm2v++v/a2tTWdv+daMsx9+nxNSw778PuY2u3B1tSwzJua3oa78VyKuM+0fZgU92pbh3dm+vLq0sZt0EU817sHrZlX/laNbQf7v68D8vJPrF6dETterXHSlatWpVjjjkmxx9/fI477risWLEiK1asSHNzc+rr61u9Js348eNz7rnn5v77789tt92Wiy66KGeddVZ7DAcAAHosvTkAALS/dgnS77rrrixYsCDf+ta3MnDgwMrPH//4x4wf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\n",
      "text/plain": [
       "<Figure size 1500x600 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "\n",
    "# 画图设置\n",
    "plt.style.use('default')\n",
    "plt.rcParams['font.family'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# 定义一个函数，用于生成正弦波\n",
    "def getSin(amp, freq, phase, sampleList):\n",
    "    return amp * np.sin(2 * math.pi * freq * sampleList + phase)\n",
    "\n",
    "# 定义一个函数，用于生成余弦波\n",
    "def getCos(amp, freq, phase, sampleList):\n",
    "    return amp * np.cos(2 * math.pi * freq * sampleList + phase)\n",
    "\n",
    "# 1. 获得混合波形\n",
    "srate = 3000           # 设置采样率为 3000\n",
    "t = np.linspace(0, 1, srate)     # 在 0 到 1 的范围内生成等间距的采样点\n",
    "\n",
    "# 分别生成正、余弦波\n",
    "s1 = getSin(amp=1.5, freq=-30, phase=0, sampleList=t)\n",
    "s2 = getCos(amp=3, freq=-5, phase=0, sampleList=t)\n",
    "s3 = getSin(amp=10, freq=-100, phase=0, sampleList=t)\n",
    "s4 = getCos(amp=20, freq=-120, phase=0, sampleList=t)\n",
    "m= s1+s2+s3+s4             # 将正、余弦波相加，得到混合波形\n",
    "\n",
    "# 2. 获得傅里叶系数\n",
    "fCoefs = np.fft.fft(m,srate)\n",
    "\n",
    "# 3. 获得振幅列表：每一个绕线的重心到原点的距离\n",
    "amp_list=2*np.abs(fCoefs/srate)\n",
    "\n",
    "# 把频率轴从0~3000 转变成 0~1500 然后 -1500~-1\n",
    "freqs = np.fft.fftfreq(len(amp_list), 1/srate)\n",
    "\n",
    "fg,ax=plt.subplots(1,2,figsize=(15,6),sharex=True,sharey=True)\n",
    "\n",
    "# 然后把 频率轴 和 数据 都变成 0hz 在中间，向左是负频率，向右是正频率的形式\n",
    "amp_shifted=np.fft.fftshift(amp_list)\n",
    "freq_shift=np.fft.fftshift(freqs)\n",
    "\n",
    "amp_list1=np.copy(amp_list)    #复制并不修改原来的数组\n",
    "mask = (amp_list1>0.5)\n",
    "list = mask*amp_list1        #大于1的归0\n",
    "list[:-110][110:]=0         #选取大于110hz为0\n",
    "\n",
    "amp_shifted1=np.fft.fftshift(list)\n",
    "freq_shift1=np.fft.fftshift(freqs)\n",
    "\n",
    "ax[0].stem(freq_shift,amp_shifted)\n",
    "ax[0].set_xlim([-150,150])\n",
    "ax[0].set_title(\"原始振幅谱\")\n",
    "\n",
    "ax[1].stem(freq_shift1,amp_shifted1)\n",
    "ax[1].tick_params(labelleft=True)\n",
    "ax[1].set_title(\"去噪后的振幅谱\")\n",
    "for ax in ax:\n",
    "    ax.grid(True)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "35053ce3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
